package arithmetic;

import java.util.Iterator;

/**
 *  使用链表实现栈  核心思想  栈中有一个变量是链表的头节点first，还有一个变量表示栈大小的N
 *  其中头节点first为栈的栈顶，压栈时候，first指向新创建的节点，新创建的节点的next指向当前fist节点。同时 N加一。
 *  栈弹出的时候，first指向当前first节点的next。并返回当前节点first的Item元素。同时N-1。
 */
public class LinkedStack<Item> implements Iterable<Item> {

    public static void main(String[] args) {
        LinkedStack<String>  linkedStack=new LinkedStack<>();
        linkedStack.push("it");
        linkedStack.push(" ");
        linkedStack.push("was");
        linkedStack.push(" ");
        linkedStack.push("-");
        linkedStack.push(" ");
        linkedStack.push("the");
        linkedStack.push(" ");
        linkedStack.push("best");
        linkedStack.push(" ");
        linkedStack.push("time");

        Iterator<String> iterator = linkedStack.iterator();
        while (iterator.hasNext()){
            System.out.print(iterator.next());
        }
    }

    private int N;

    private Node first; //栈顶

    private class Node {
        private Item item;
        private Node next;
    }

    //压栈
    public void push(Item item) {
        Node oldNode = first;
        first = new Node();
        first.item = item;
        first.next = oldNode;
        N++;
    }


    //弹出栈
    public Item pop() {
        Node oldNode = first;
        first = first.next;
        N--;
        return oldNode.item;

    }

    @Override
    public Iterator<Item> iterator() {
        return new Iterator<Item>() {
            Node current=first;
            @Override
            public boolean hasNext() {
                return null!=current;
            }

            @Override
            public Item next() {
                Item  item= current.item;
                current=current.next;
                return item;
            }
        };
    }


}
